package zdori;

import java.util.Scanner;

public class J32_Exception {

	/**
	 * @param args
	 * 
	 * 예외처리 
	 * 오류 처리는 프로그래밍 언어의 중요한 기능임
	 * 좋은 오류 처리 메커니즘은 프로그래머가 보다 쉽게 강력한 프로그램을 작성하고 몰래 섞여 들어오는 버그를 방지 할 수 있음
	 * 
	 * 일부 언어에서는 발생가능한 모든 오류를 미리 감지 하기 위해
	 * 강제로 다중 if문을 사용
	 * 이런 경우 코드가 지나치게 복잡해짐
	 * 
	 * 자바에서는 try 문을 사용하여 오류를 보다 쉽게 감지하고 처리
	 * 
	 * 오류 error vs 예외 exception
	 * 프로그램의 정상실행을 방해하는 요소
	 * 오류:프로그램의 잘못된 코드나 cpu 연산의 잘못된 동작으로 발생
	 * 컴파일 오류,실행기간 오류로 다시 분류
	 * 
	 * 컴파일 오류 : 잘못된 문법으로 인해 발생된 오루
	 * 실행시간 오류 : 잘못된 코드 사용이나 하드웨어의 오동작으로 인한 오류
	 * 하드웨어적으로 발생하는 오류를 제외하고 모든오류는 개발자가 적절히 수정 가능
	 * 
	 * 예외 : 일반적인 프로그램 실행 순서를 벗어나는 것
	 * 프로그램 상에서 코드에 의해 예회를 바로 잡을 수 있음
	 * 
	 * 실행기간 오류가 생길것 같은 코드는 일반적으로 try ~ 문으로 격리가능
	 * 오류가 발생하면 try 블록의 처리를 중단하고 catch 블록으로 제어가 넘어감
	 * 
	 * 
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		// 오류가 발생하는 경우
		
		System.out.println("보임?");
		//System.out.println(100/0);
		System.out.println("또 보임?");
		
		// 오류가 발생하는 경우
		
		System.out.println("보임?");
		try {
			System.out.println(100/0);
		} catch (Exception e) {
			// TODO: handle exception
			//System.out.println("0으로 나눔");
			//System.out.println(e);
			e.printStackTrace();
			//e.getMessage();
			
		}
		System.out.println("또 보임?");
		
		//1~10 사이 정수 받아서 출력
		
		Scanner sc = new Scanner(System.in);
		boolean a = true;
		/*
		try {
			while(a){
				System.out.println("숫자입력");
				int num = sc.nextInt();
				if(num > 10){
					a = false;
					System.out.println("숫자가 10보다 큼  : "+num);
				}else{
					System.out.println("숫자는 "+num);
				}
				
			}
		} catch (Exception e) {
			// TODO: handle exception
			//e.printStackTrace();
			//e.getMessage();
			System.out.println(e.getMessage());
		}
		*/
		/*while(a){
			System.out.println("숫자입력");
			int num = 0;
			try {
				num = sc.nextInt();
			} catch (Exception e) {
				// TODO: handle exception
				//e.printStackTrace();
				//e.getMessage();
				System.err.println("오류");
				System.out.println(e.getMessage());
				sc = new Scanner(System.in);
				//이전에 입력한 내용이 문자인 경우 스태너 내부 저장소 버퍼에 남아있기 때문에 계속무한반복으로 위 문장이 출력됨
				//스캐너를 다시 초기화 해야됨
				//코드에서 발생할 수 있는 예외가 하나 이상은 경우 다중 캐치문으로 각각의 예외에 따라 독자적인 오류처리를 할 수 있음
				// 
				 
				
			}
			
			if(num > 10){
				a = false;
				System.out.println("숫자가 10보다 큼  : "+num);
			}else{
				System.out.println("숫자는 "+num);
			}
			
		}
		*/
		
		//예외처리1
		int[] name = new int[3];
		try {
			name[0] = 1;
			name[1] = 2;
			name[2] = 3;
			name[3] = 4;
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("배열크기초과");
		}
		
		//예외처리2
		try {
			int result = 0;
			for(int i = 10;i>=0;i--){
				result +=(int)(Math.random()*100)/i;
			}
			System.out.println(result);
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("0으로 못나눔");
		}
		
		//다중 예외처리
		/*
		try {
			System.out.println(100/0);
			char[] grade = new char[3];
			grade[3] = 'a';
		} catch (Exception e) {
			// TODO: handle exception
			System.out.println("0 못나눔");
		}
		*/		
		
		try {
			//System.out.println(100/0);
			char[] grade = new char[3];
			grade[3] = 'a';
		} catch(ArithmeticException ae){
			System.out.println("0으로 못나눔");
			ae.printStackTrace();
		} catch(ArrayIndexOutOfBoundsException aiode){
			System.err.println("배열의 범위 못넘음");
			aiode.printStackTrace();
		} catch(Exception e){
			System.out.println("알수 없는 오류");
			e.printStackTrace();
		}
		
		
	}

}
